#include <iostream>
#include <string>
#include <list>
using namespace std;

// class Date
// {
// public:
//     Date(int year = 6,int month=  6,int day = 6)
//     :_year(year),_month(month),_day(day)
//     {

//     }

//     void print()
//     {
//         cout << _year << '-' << _month <<'-' << _day << endl;
//     }
// private:
//     int _year;
//     int _month;
//     int _day;
// };

// template <class ...Args>
// void func(Args&&... args)
// {
//     Date d1(args...);
//     d1.print();
// }

// int main()
// {
//     func(1949,11,11);
//     return 0;
// }

// template <class T>
// T printagr(T t)
// {
//     cout << t << ' ';
//     return 0;
// }

// template <class ...Args>
// void showlist(Args... args)
// {
//     int arr[] = {printagr(args)...};
//     cout << endl;
//     for(int i = 0; i < sizeof...(args); i++)
//     {
//         cout << arr[i] << endl;
//     }
// }

// int main()
// {
//     showlist(1,2,3,4,5,6,7,8);
//     return 0;
// }

// int main()
// {
//     auto add = [](int a,int b) ->int {return a + b; };

//     cout << add(1,3) << endl;

//     auto Swap = [](int& a, int& b) -> void {
//         int temp = a;
//         a = b;
//         b = temp;
//     };

//     int x = 10;
//     int y = 20;
//     Swap(x,y);

//     cout << x << endl;
//     cout << y << endl;

//     auto func = []{
//         cout << "hello world" << endl;
//     };

//     func();
//     return 0;
// }

// int main()
// {
//     int x = 1, y = 2;

//     //传值捕捉，捕捉到的是当前对象的拷贝
//     auto swap1 = [x,y]()mutable {
//         int temp = x;
//         cin >> x;
//         y = temp;
//     };

//     swap1();
//     cout << x << endl;
//     cout << y << endl;

//     return 0;
// }

// int main()
// {
//     int x = 1, y = 2;

//     // //传引用捕捉
//     // auto swap1 = [&x,&y] {
//     //     int temp = x;
//     //     cin >> x;
//     //     y = temp;
//     // };

//     // swap1();
//     // cout << x << endl;
//     // cout << y << endl;

//     int m = 3, n = 4;
//     //传值捕捉当前域的所有对象
//     auto func = [=]{
//         return x + y + m + n;
//     };

//     cout << func() << endl;

//     //传引用捕捉当前域的所有对象
//     auto func1 = [&]{
//         x++;
//         y++;
        
//         return x + y + m + n;
//     };

//     cout << func1() << endl;

//     //传引用捕捉当前域的所有对象,某些对象传值捕捉
//     auto func2 = [&,n]{
//         x++;
//         //n++;//n是传值，不能修改，除非加上mutable
//         m++;
//         return x + y + m + n;
//     };
//      cout << func2() << endl;
//     return 0;
// }

// #include <queue>
// #include <vector>

// int main()
// {
//     auto Less1 = [](const int a,const int b) {
//         return a < b;
//     };
//     //
//     priority_queue<int,vector<int>,decltype(Less1)> p1(Less1);
//     p1.push(7);
//     p1.push(2);
//     p1.push(1);
//     p1.push(4);
//     p1.push(9);
//     p1.push(5);
//     p1.push(3);
//     p1.push(10);
//     p1.push(6);
//     p1.push(8);

//     while(!p1.empty())
//     {
//         cout << p1.top() << endl;
//         p1.pop();
//     }
//     return 0;
// }

//包装器
template <class F,class T>
T useF(F f,T x)
{
    static int count = 0;
    cout << "count:" << ++count << endl;
    cout << "count:" << &count << endl;

    return f(x);
}

double f(double i)
{
    return i / 2;
}

struct Functor
{
    double operator()(double d)
    {
        return d / 3;
    }
};

#include <functional>

int main()
{
    function<double(double)> fc1 = f;
    //cout << fc1(11.11) << endl;
    cout << useF(fc1,11.11) << endl;

    function<double(double)> fc2 = Functor();
    cout << useF(fc2,11.11) << endl;

    function<double(double)> fc3 = [](double d){return d / 4;};
    cout << useF(fc3,11.11) << endl;
    return 0;
}

